package basis.ea;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;


/**
 * (De-)Serialisierung von Objekten. Export und Import von Klassen 
 * in vorgegebenen Formaten. Diese Klasse nutzt die XStream-Bibliothek 
 * fuer die XML-Serialisierung.
 * 
 * Lizenzhinweis fuer die XStream-Bibliothek:
 * Die Weitergabe und Verwendung in Quellcode oder Binaerform, mit oder 
 * ohne Veraenderungen, sind zulaessig.
 *   Copyright (c) 2003-2006, Joe Walnes
 *   Copyright (c) 2006-2009, XStream Committers
 *   All rights reserved.
 * (http://xstream.codehaus.org/license.html)
 * 
 * Datei: EA.java                   
 * Datum: 28.11.2011   
 *                  
 * @author Alexander Bredo 
 * @version 0.4
 */
public class EA
{
  private final static String stammverzeichnis = "data/";
  private final static String erweiterung = ".dat";
  private final static String erweiterungXML = ".xml";
  private String klassenbezeichnung;


  /**
   * Erzeugt ein Objekt der Klasse EA. Die Klassenbezeichnung wird 
   * fuer die Bildung eines Dateinamens genutzt.
   */
  public EA (String klassenbezeichnung)
  {
    this.klassenbezeichnung = klassenbezeichnung;
  }

  
  /**
   * Gibt den Dateinamen fuer binaere Serialisierung zurueck.
   */
  private String gibDateiname ()
  {
    return stammverzeichnis + klassenbezeichnung + erweiterung;
  }

  
  /**
   * Gibt den Dateinamen fuer XML-Serialisierung zurueck.
   */
  private String gibDateinameXML ()
  {
    return stammverzeichnis + klassenbezeichnung + erweiterungXML;
  }
  
  
  /**
   * Speichert ein Java-Objekt als serialisierte Datei. Das Objekt und 
   * alle Subobjekte muessen ISerializable implementieren.
   */
  public void speichern (Object objekt) throws IOException
  {
    FileOutputStream datei;
    ObjectOutputStream ausgabeStream;

    datei = new FileOutputStream (gibDateiname ());
    ausgabeStream = new ObjectOutputStream (datei);
    ausgabeStream.writeObject (objekt);
    ausgabeStream.close ();
  }


  /**
   * Speichert ein Java-Objekt als XML-Datei. Das Objekt und 
   * alle Subobjekte muessen ISerializable implementieren.
   */
  public void speichernXML (Object objekt) throws IOException
  {
    XStream xstream = new XStream (new StaxDriver());
    EAExport.zeichenketteSpeichern (xstream.toXML (objekt), 
        gibDateinameXML ());
  }

  
  /**
   * Liest ein serialisiertes Objekt ein und gibt ein Java-Objekt 
   * zurueck.
   */
  public Object einlesen () throws IOException, ClassNotFoundException
  {
    FileInputStream datei;
    ObjectInputStream eingabeStrom;
    Object objekt = null;

    datei = new FileInputStream (gibDateiname ());
    eingabeStrom = new ObjectInputStream (datei);
    objekt = eingabeStrom.readObject ();
    eingabeStrom.close ();
      
    return objekt;
  }
  

  /**
   * Liest ein XML-Objekt ein und gibt ein Java-Objekt zurueck.
   */
  public Object einlesenXML ()
  {
    XStream xstream = new XStream (new StaxDriver());
    return xstream.fromXML (new File (gibDateinameXML ()));
  }
  
  
  /**
   * Prueft ob ein gespeichertes Objekt existiert.
   */
  public boolean istGespeichertesObjektVorhanden ()
  {
    File file = new File (gibDateiname ());
    return file.exists ();
  }


  /**
   * Prueft ob ein gespeichertes XML-Objekt existiert.
   */
  public boolean istGespeichertesXMLObjektVorhanden ()
  {
    File file = new File (gibDateinameXML ());
    return file.exists ();
  }

  
  /**
   * Exportiert ein Objekt in eine (oder mehrere) Dateien. Deswegen 
   * muss nur der Ordner ohne Dateiname angegeben werden.
   */
  public static void exportieren (Object objekt, String ordner,
      Exportformate format) throws IOException
  {
    new Exportdatei (objekt, ordner, format);
  }


  /**
   * Importiert eine Datei und gibt eine Datensatzliste zurueck
   */
  public static ArrayList<Datensatz> importieren (String dateipfad,
      Importformate format) throws FileNotFoundException
  {
    Importdatei imd = new Importdatei (dateipfad, format);
    
    return imd.gibDatensatzListe ();
  }


  /**
   * Gibt das enstprechende Exportobjekt aufgrund der Bezeichnung
   */
  public static Exportformate gibExportformat (String format)
  {
    for (Exportformate exf : Exportformate.values ())
    {
      if (format.equalsIgnoreCase (exf.toString ()))
      {
        return exf;
      }
    }
    return null;
  }

  
  /**
   * Gibt das enstprechende Importobjekt aufgrund der Bezeichnung
   */
  public static Importformate gibImportformat (String format)
  {
    for (Importformate imf : Importformate.values ())
    {
      if (format.equalsIgnoreCase (imf.toString ()))
      {
        return imf;
      }
    }
    return null;
  }

}
